加权随机算法的python实现
1 随机抽奖
本次运行环境为:
win7
jupyter notebook
python 3.6
1.1 随机抽取一个元素
用 random.choice()
来实现随机抽取一个元素。
from random import choice
import random
import pandas as pd
name = ['张三', '李四', '王五', '小明', '小郑', '梅西', 'C罗', '内少']
random_name = choice(name)
random_name
1.2 随机抽取多个元素
可以考虑用 random.sample()
来随机抽取多个元素。
# 从name中随机选择3个元素
slice_sample = random.sample(name, 3)
slice_sample
1.3 考虑权重后随机抽取一个元素
如果是不同的成员有不同的权重,比如本次抽奖,在赞赏的同时有评论的人员,赋予的权重要求稍微高一些。可以自定义一个函数,用来考虑权重后随机抽取一个元素。
# weight_data 的数据类型为 dict
def random_weight(weight_data):
total = sum(weight_data.values()) # 权重求和
ra = random.uniform(0, total) # 在0与权重和之前获取一个随机数
curr_sum = 0
ret = None
# keys = weight_data.iterkeys() # 使用Python2.x中的iterkeys
keys = weight_data.keys() # 使用Python3.x中的keys
for k in keys:
curr_sum += weight_data[k] # 在遍历中,累加当前权重值
if ra <= curr_sum: # 当随机数<=当前权重和时,返回权重key
ret = k
break
return ret
# 用Pandas从excel中读取数据
df = pd.read_excel('choujiang.xlsx')
# 将数据进行整理
df_data = df[['name', 'weight']].set_index('name')
# 根据上面的上述,获取dict类型的数据
data = df_data.to_dict()['weight']
random_weight(data)
1.4 考虑权重后,随机获取多个元素
最终,本次需要在考虑权重后,随机获取多个元素(N个),并且不能重复,可以在上个函数的基础上,再添加一个自定义函数,来一次性加权随机抽取多个元素。
def choujiang(data, N):
# N = 6
results = []
i = 0
while i < N:
m = random_weight(data)
if m in results:
continue
results.append(m)
i = i+1
return results
choujiang(data,3)
---------------- End ----------------
点击前往【项目实战】
知识星球
我的知识星球【Python数据之道成长圈】已开通,想加入的同学,请回复数字 “2” 了解详情。